﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
using CestodoBebe.Util;



namespace CestoDoBebe.DAO
{
    public class Usuario
    {
        private int m_CodUsuario;
        private string m_NmeUsuario;
        private string m_NmeEmail;
        private string m_NmeLogin;
        private string m_NmeSenha;
        private int m_FlgAtivo;
        private byte[] m_imgPerfil;
        private string m_dscLembrete;
        private int m_codTipoUsuario;
        private string m_NmeTipoUsuario;
        private Endereco m_Endereco;

        //AcessoDados dados;

        #region propriedades
        /// <summary>
        /// Classe de usuario do Sistema
        /// </summary>
        public Usuario()
        {
            m_CodUsuario = int.MinValue;
            m_NmeUsuario = string.Empty;
            m_NmeEmail = string.Empty;
            m_NmeLogin = string.Empty;
            m_NmeSenha = string.Empty;
            m_FlgAtivo = 0;
            m_imgPerfil = null;
            m_dscLembrete = string.Empty;
            m_codTipoUsuario = int.MinValue;
            m_Endereco = null;

            m_Endereco = new Endereco();
        }
        
        public int CodUsuario
        {
            get { return m_CodUsuario; }
            set { m_CodUsuario = value; }
        }

        public string NmeUsuario
        {
            get { return m_NmeUsuario; }
            set { m_NmeUsuario = value; }
        }

        public string NmeEmail
        {
            get { return m_NmeEmail; }
            set { m_NmeEmail = value; }
        }

        public string NmeLogin
        {
            get { return m_NmeLogin; }
            set { m_NmeLogin = value; }
        }

        public string NmeSenha
        {
            get { return m_NmeSenha; }
            set { m_NmeSenha = value; }
        }

        public string dscLembreteSenha
        {
            get { return m_dscLembrete; }
            set { m_dscLembrete = value; }
        }

        public int FlgAtivo
        {
            get { return m_FlgAtivo; }
            set { m_FlgAtivo = value; }
        }

        public byte[] imgPerfil
        {
            get { return m_imgPerfil; }
            set { m_imgPerfil = value; }
        }

        public int codTipoUsuario
        {
            get { return m_codTipoUsuario; }
            set { m_codTipoUsuario = value; }
        }

        public string NmeTipoUsuario
        {
            get { return m_NmeTipoUsuario; }
            set { m_NmeTipoUsuario = value; }
        }

        public Endereco Endereco
        {
            set { m_Endereco = value; }
            get { return m_Endereco; }
        }

        #endregion

        public bool IncluirUsuario(ref Usuario objUsuario)
        {
            using (AcessoDados dados = new AcessoDados())
            {
                try
                {
                
                    List<MySqlParameter> parametros = new List<MySqlParameter>();

                    parametros.Add(new MySqlParameter("NMEUSUARIO", objUsuario.NmeUsuario));
                    parametros.Add(new MySqlParameter("NMEEMAIL", objUsuario.NmeEmail));
                    parametros.Add(new MySqlParameter("NMESENHA", getMD5Hash(objUsuario.NmeSenha)));
                    parametros.Add(new MySqlParameter("FLGATIVO", objUsuario.FlgAtivo));
                    parametros.Add(new MySqlParameter("IMGPERFIL", objUsuario.imgPerfil));
                    parametros.Add(new MySqlParameter("DSCLEMBRETE", objUsuario.dscLembreteSenha));
                    parametros.Add(new MySqlParameter("CODTIPOUSUARIO", objUsuario.codTipoUsuario));

                    MySqlDataReader dr = dados.ObterLeitor("USP_INSERE_USUARIO", parametros);

                    dr.Read();

                    objUsuario.CodUsuario = Convert.ToInt32(dr["CODUSUARIO"].ToString());

                    dr.Close();

                    bool result = (objUsuario.CodUsuario > 0); //dados.ExecutarComando("USP_TESTE", parametros);

                    parametros.Clear();

                    parametros.Add(new MySqlParameter("PCODUSUARIO", objUsuario.CodUsuario));
                    parametros.Add(new MySqlParameter("PNMECIDADE", objUsuario.Endereco.NmeCidade));
                    parametros.Add(new MySqlParameter("PSGLUF", objUsuario.Endereco.SglUf));

                    return (result && dados.ExecutarComando("USP_INSERE_ENDERECO", parametros));
                        
                   
                }
                catch (Exception ex)
                {
                    return false;
                }

            
            }
        }

        public bool ValidaDisponibilidadeEmail(string nmeEmail)
        {
            using (AcessoDados dados = new AcessoDados())
            {

                List<MySqlParameter> parametros = new List<MySqlParameter>();
                parametros.Add(new MySqlParameter("PNMEEMAIL", nmeEmail));

                return dados.ExecuteEscalar("USP_CONSULTA_EMAIL", parametros);

            }
            
        }

        private string getMD5Hash(string input)
        {

            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
            byte[] hash = md5.ComputeHash(inputBytes);
            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("X2"));
            }
            return sb.ToString();
        }

        public string Login(string nmeEmail, string Senha, ref Usuario objUsuario)
        {
            objUsuario = new Usuario();
            string MsgRetorno = "";
            
            using (AcessoDados dados = new AcessoDados())
            {

                List<MySqlParameter> parametros = new List<MySqlParameter>();
                parametros.Add(new MySqlParameter("PNMEEMAIL", nmeEmail));

                MySqlDataReader dr = dados.ObterLeitor("USP_LOGIN_USUARIO", parametros);

                if (!dr.HasRows)
                    MsgRetorno = "O login informado é inválido!";
                else
                {

                    while (dr.Read())
                    {
                        objUsuario.CodUsuario = Convert.ToInt32(dr["CODUSUARIO"]);
                        objUsuario.NmeUsuario = dr["NMEUSUARIO"].ToString();
                        objUsuario.NmeEmail = dr["NMEEMAIL"].ToString();
                        objUsuario.NmeSenha = dr["NMESENHA"].ToString();
                        objUsuario.FlgAtivo = Convert.ToInt32(dr["FLGATIVO"]);
                    }


                    if ( MsgRetorno == "" )
                    {
                        if (getMD5Hash(Senha) != objUsuario.NmeSenha)
                        //if ( Senha.ToLower() != objUsuario.NmeSenha.ToLower() )
                            MsgRetorno = MsgRetorno + "A senha informada é inválida!";
                    }

                }
                

                return MsgRetorno;

            }
            
        }

        public bool ConfirmaCadastroUsuario(int codUsuario)
        {
            using (AcessoDados dados = new AcessoDados())
            {
                try
                {

                    List<MySqlParameter> parametros = new List<MySqlParameter>();
                    parametros.Add(new MySqlParameter("P_CODUSUARIO", codUsuario));

                    MySqlDataReader dr = dados.ObterLeitor("USP_ATIVA_CADASTRO_USUARIO", parametros);

                    dr.Read();

                    int CodUsuario = Convert.ToInt32(dr["CODUSUARIO"].ToString());

                    dr.Close();

                    return (CodUsuario > 0);
                }
                catch (Exception ex)
                {
                    return false;
                }

            }
        }

        public bool AtualizaCadastro(ref Usuario objUsuario)
        {
            return false;
        }

        public bool ValidaDisponibilidadeEmailAlteracao(string nmeEmail, string login)
        {
            using (AcessoDados dados = new AcessoDados())
            {

                List<MySqlParameter> parametros = new List<MySqlParameter>();
                parametros.Add(new MySqlParameter("PNMEEMAIL", nmeEmail));
                parametros.Add(new MySqlParameter("PLOGIN", login));

                return dados.ExecuteEscalar("USP_CONSULTA_EMAIL_ALTERACAO", parametros);

            }
        }


    }
}
